﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FileImportSystem2.Services
{
    internal class FileNameServer
    {
        /// <summary>
        /// 从文件名中提取日期信息
        /// </summary>
        /// <param name="filePath"></param>
        /// <returns></returns>
        public static (string dateFull, string dateMonth) getDateFromFilePathOld(string filePath)
        {
            try
            {
                string fileName = Path.GetFileNameWithoutExtension(filePath);
                // 尝试从文件名中提取日期信息（格式如：x月x日x文件）
                string DateStr = fileName.Split("日")[0] + "日";
                if (DateStr.IndexOf("年") < 0) // 如果没有年，则补上当前年份
                {
                    DateStr = DateTime.Now.Year.ToString() + "年" + DateStr;
                }
                DateTime date = DateTime.ParseExact(DateStr, "yyyy年M月d日", null);

                // 返回三个值：完整日期字符串、月份字符串和DateTime对象
                return (date.ToString("yyyy-MM-dd"), date.ToString("yyyy-MM"));
            }
            catch
            {
                // 错误时返回三个默认值
                return ("0000-00-00", "0000-00");
            }
        }

        public static (string dateFull, string dateMonth) getDateFromFilePath(string filePath)
        {
            if (string.IsNullOrEmpty(filePath))
                return ("0000-00-00", "0000-00");

            // 套用老方法
            (string dateFull, string dateMonth) = getDateFromFilePathOld(filePath);

            if (dateMonth != "0000-00")
            {
                return (dateFull, dateMonth);
            }

            string fileName = Path.GetFileNameWithoutExtension(filePath);
            DateTime parsedDate;

            // 优先尝试匹配并提取文件名中可能存在的日期字符串模式
            var dateMatch = System.Text.RegularExpressions.Regex.Match(fileName, @"(?<!\d)(?<year>\d{4})[-年]?(?<month>\d{1,2})[-月]?(?<day>\d{1,2})?日?(?!\d)");
            if (dateMatch.Success)
            {
                int year = int.Parse(dateMatch.Groups["year"].Value);
                int month = int.Parse(dateMatch.Groups["month"].Value);
                int day = dateMatch.Groups["day"].Success ? int.Parse(dateMatch.Groups["day"].Value) : 1; // 如果无日部分，默认为1

                if (IsValidDate(year, month, day))
                {
                    parsedDate = new DateTime(year, month, day);
                    return (parsedDate.ToString("yyyy-MM-dd"), parsedDate.ToString("yyyy-MM"));
                }
            }

            // 定义多种支持的日期格式列表，按优先级尝试
            string[] supportedFormats = new string[]
            {
                "M月d日",      // 1月1日 (原始支持)
                "yyyyMMdd",      // 20250101
                "yyyy-MM-dd",    // 2025-01-01
                "yyyyMM",        // 202501 (扩展支持)
                "yyyy-M-d",      // 2025-1-1
                "yyyy年M月d日",  // 2025年1月1日 (原始支持)
                "yyyy年M月",     // 2025年1月 (扩展支持)
                "yyMMdd",        // 250101 (两位年份)
                "yy-MM-dd",      // 25-01-01 (两位年份)
            };

            // 尝试用各种格式解析整个文件名
            foreach (string format in supportedFormats)
            {
                if (DateTime.TryParseExact(fileName, format, null, System.Globalization.DateTimeStyles.None, out parsedDate))
                {
                    return (parsedDate.ToString("yyyy-MM-dd"), parsedDate.ToString("yyyy-MM"));
                }
            }

            // 如果上述方法都失败，尝试使用DateTime的默认解析（灵活性高，但准确性低）
            if (DateTime.TryParse(fileName, out parsedDate))
            {
                return (parsedDate.ToString("yyyy-MM-dd"), parsedDate.ToString("yyyy-MM"));
            }

            // 所有解析尝试均失败
            return ("0000-00-00", "0000-00");
        }

        // 辅助方法：检查年月日是否构成一个有效的日期
        private static bool IsValidDate(int year, int month, int day)
        {
            if (year < 1 || year > 9999) return false;
            if (month < 1 || month > 12) return false;
            if (day < 1 || day > DateTime.DaysInMonth(year, month)) return false;
            return true;
        }

        /// <summary>
        /// 根据月份字符串取前n个月的数据库路径
        /// </summary>
        /// <param name="dateMonth"></param>"
        public static string getDbPathByMonth(string dateMonth, int n = 0)
        {
            try
            {
                DateTime date = DateTime.ParseExact(dateMonth + "-01", "yyyy-MM-dd", null);
                date = date.AddMonths(-n);
                string targetMonth = date.ToString("yyyy-MM");
                string dbPath = Path.Combine(
                    AppConfig.dbMonFd,
                    $"{targetMonth}.db"
                );
                return dbPath;
            }
            catch
            {
                return string.Empty;
            }
        }
    }
}
